home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / oplaser / oplaser.lzh / enemy.c < prev    next >
C/C++ Source or Header  |  1998-10-25  |  4KB  |  208 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <XSP2lib.H>
  5. #include "boss01.h"
  6. #include "enemy.h"
  7. #include "fxsp2lib.h"
  8.  
  9. #define enemy_MAX    64    /* 最大数 */
  10. #define R_TOP    1.5*M_PI    /* 回転角初期値 */
  11. #define R    12.0        /* 回転長さ */
  12. #define RA    0.01        /* 回転角加速度 */
  13. #define RVMAX    0.1        /* 回転角速度最大値 */
  14.  
  15. #define RX    8.0        /* 回転中心 x */
  16. #define RY    -12.0        /* 回転中心 y */
  17. #define BX    -16        /* 本体スプライト座標へのオフセット */
  18. #define BY    -24
  19. #define PX    -16        /* パーツ回転角からスプライト座標へのオフセット */
  20. #define PY    -24
  21.  
  22. #define SEQ_1    22        /* ばね振動開始時間 */
  23.  
  24. #define SPRING_TOP_Y    -2.0    /* ばね振動 y 初期値 */
  25. #define SPRING_K        0.5    /* ばね定数 */
  26. #define SPRING_M        0.70    /* ばね振動摩擦計数 */
  27.  
  28.  
  29. ENEMY *enemy, *enemy_top, *enemy_null_top;
  30.  
  31.  
  32. int enemy_init0 (void)
  33. {
  34.     int i;
  35.  
  36.     if ((enemy = malloc (sizeof (enemy) * enemy_MAX)) == NULL)
  37.         return (-1);
  38.  
  39.     enemy_top = NULL;
  40.     enemy_null_top = enemy;
  41.     for (i = 0; i < enemy_MAX; i++) {
  42.         enemy[i].next = &enemy[i + 1];
  43.     }
  44.     enemy[enemy_MAX - 1].next = NULL;
  45.  
  46.     return (0);
  47. }
  48.  
  49.  
  50.  
  51. void enemy_init (short type, short pt, short info, short ox, short oy)
  52. {
  53.     if (enemy_null_top != NULL) {
  54.         ENEMY *p;
  55.  
  56.         p = enemy_null_top;
  57.         enemy_null_top = p->next;
  58.         p->next = enemy_top;
  59.         enemy_top = p;
  60.  
  61.         p->type = type;
  62.         p->pt = pt;
  63.         p->info = info;
  64.         p->ox = ox;
  65.         p->oy = oy;
  66.         switch (type) {
  67.         case 0:    /* 本体 */
  68.         case 1:
  69.         case 2:
  70.         case 3:    /* 本体 */
  71.         case 4:
  72.         case 5:
  73.             break;
  74.         case 10:    /* 可動部(右) */
  75.         case 11:
  76.         case 12:
  77.         case 13:
  78.         case 14:
  79.         case 15:
  80.             p->round = R_TOP;
  81.             p->round_v = 0.0;
  82.             p->spring_y = 0.0;
  83.             p->spring_v = 0.0;
  84.             break;
  85.         case 20:    /* 可動部(左) */
  86.         case 21:
  87.         case 22:
  88.         case 23:
  89.         case 24:
  90.         case 25:
  91.             p->round = 1.5 * M_PI - (R_TOP - 1.5 * M_PI);
  92.             p->round_v = 0.0;
  93.             p->spring_y = 0.0;
  94.             p->spring_v = 0.0;
  95.             break;
  96.         default:
  97.             break;
  98.         }
  99.     }
  100. }
  101.  
  102.  
  103.  
  104. void enemy_move (void)
  105. {
  106.     ENEMY *p, *q;
  107.  
  108.     p = enemy_top;
  109.     q = NULL;
  110.     while (p != NULL) {
  111.         char erase_flag = 0;
  112.  
  113.         switch (p->type) {
  114.         case 0:    /* 本体 */
  115.         case 1:
  116.         case 2:
  117.         case 3:    /* 本体 */
  118.         case 4:
  119.         case 5:
  120.             p->x = (short) p->ox + BX + 144;
  121.             p->y = (short) p->oy + BY + 144;
  122.             xsp_set_st (p);
  123.             fxsp_set_st (p);
  124.             break;
  125.         case 10:    /* 可動部(右) */
  126.         case 11:
  127.         case 12:
  128.         case 13:
  129.         case 14:
  130.         case 15:
  131.             if (seq_counter == SEQ_1)
  132.                 p->spring_y = SPRING_TOP_Y;
  133.  
  134.             if (seq_counter < SEQ_1) {
  135.                 p->round += p->round_v;
  136.                 if ((p->round_v += RA) > RVMAX)
  137.                     p->round_v = RVMAX;
  138.             } else {
  139.                 p->spring_y += p->spring_v;
  140.                 p->spring_v -= SPRING_K * p->spring_y;
  141.                 p->spring_v *= SPRING_M;
  142.             }
  143.  
  144.             p->x = R * cos (p->round) + RX + PX + p->ox + 144;
  145.             p->y = -R * sin (p->round) + RY + PY + p->spring_y + p->oy + 144;
  146.             xsp_set_st (p);
  147.             fxsp_set_st (p);
  148.             break;
  149.         case 20:    /* 可動部(左) */
  150.         case 21:
  151.         case 22:
  152.         case 23:
  153.         case 24:
  154.         case 25:
  155.             if (seq_counter == SEQ_1)
  156.                 p->spring_y = SPRING_TOP_Y;
  157.  
  158.             if (seq_counter < SEQ_1) {
  159.                 p->round += p->round_v;
  160.                 if ((p->round_v -= RA) < -RVMAX)
  161.                     p->round_v = -RVMAX;
  162.             } else {
  163.                 p->spring_y += p->spring_v;
  164.                 p->spring_v -= SPRING_K * p->spring_y;
  165.                 p->spring_v *= SPRING_M;
  166.             }
  167.             p->x = R * cos (p->round) - RX - (32 + PX) + p->ox + 144;
  168.             p->y = -R * sin (p->round) + RY + PY + p->spring_y + p->oy + 144;
  169.             xsp_set_st (p);
  170.             fxsp_set_st (p);
  171.             break;
  172.         }
  173.  
  174.  
  175.         if (erase_flag) {
  176.             if (q == NULL) {    /* リストの一番最初を削除 */
  177.                 enemy_top = p->next;
  178.                 p->next = enemy_null_top;
  179.                 enemy_null_top = p;
  180.                 q = NULL;
  181.                 p = enemy_top;
  182.             } else {
  183.                 q->next = p->next;
  184.                 p->next = enemy_null_top;
  185.                 enemy_null_top = p;
  186.                 p = q->next;
  187.             }
  188.         } else {
  189.             q = p;
  190.             p = p->next;
  191.         }
  192.     }
  193. }
  194.  
  195.  
  196. void enemy_tini (void)
  197. {
  198.     int i;
  199.  
  200.     enemy_top = NULL;
  201.     enemy_null_top = enemy;
  202.     for (i = 0; i < enemy_MAX; i++) {
  203.         enemy[i].next = &enemy[i + 1];
  204.     }
  205.     enemy[enemy_MAX - 1].next = NULL;
  206.  
  207. }
  208.